// #include<iostream>
// #include<pthread.h>
// #include<unistd.h>
// #include<string>

// using namespace std;

// #include"mythread.hpp"
// #include"lockGuard.hpp"

// //票数
// int tickets=500;
// pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;


// void threadRoutine(void *args)
// {
//     std::string message = static_cast<const char *>(args);
//     while (true)
//     {
//         // pthread_mutex_lock(&mutex); // 加锁，是一个让不让你通过的策略
//         {
//             lockGuard lockguard(&mutex); // RAII 风格的锁
//             if (tickets > 0)
//             {
//                 usleep(2000);
//                 cout << message << " get a ticket: " << tickets-- << endl; // 临界区
//             }
//             else
//             {
//                 break;
//             }
//         }
//     }
// }

// int main()
// {
//     Thread t1(1, threadRoutine, (void *)"user1");
//     Thread t2(2, threadRoutine, (void *)"user2");
//     Thread t3(3, threadRoutine, (void *)"user3");
//     Thread t4(4, threadRoutine, (void *)"user4");

//     t1.run();
//     t2.run();
//     t3.run();
//     t4.run();

//     t1.join();
//     t2.join();
//     t3.join();
//     t4.join();

// }

#include<iostream>
#include<pthread.h>
#include<unistd.h>
#include<string>

using namespace std;


//票数
int tickets=500;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;

//模拟抢票
void* ThreadRoutine(void* args)
{
    string name=static_cast<const char*>(args);

    while(true)
    {
        pthread_mutex_lock(&mutex);
        if(tickets>0)
        {
            //如果票大于0，就可以抢
            cout<<name<< " got the ticket: "<<tickets--<<endl;
            usleep(1000);
            pthread_mutex_unlock(&mutex);
        }
        else
        {
            //小于等于0代表抢完了
            pthread_mutex_unlock(&mutex);
            break;
        }
    }
    return nullptr;
}

int main()
{
    //创建4个线程模拟抢票
    pthread_t th[4];
    int num=sizeof(th)/sizeof(th[0]);

    for(int i=0;i<num;++i)
    {
        //给每个线程命名
        char *name=new char[64];
        snprintf(name,64,"thread_%d",i+1);
        //创建线程
        pthread_create(th+i,nullptr,ThreadRoutine,name);
    }

    //线程等待
    for(int i=0;i<num;++i)
    {
        pthread_join(th[i],nullptr);
    }

    return 0;
}



// #include<iostream>
// #include<pthread.h>
// #include<unistd.h>

// using namespace std;

// //票数
// int tickets=50;

// //模拟抢票
// void* ThreadRoutine(void* args)
// {
//     string name=static_cast<const char*>(args);
// 	//一直抢票
//     while(true)
//     {
//         if(tickets>0)
//         {
//             //如果票大于0，就可以抢
//             usleep(2000);
//             cout<<name<< " got the ticket: "<<tickets--<<endl;
//         }
//         else
//         {
//             //小于等于0代表抢完了
//             break;
//         }
//     }
//     return nullptr;
// }

// int main()
// {
//     //创建4个线程模拟抢票
//     pthread_t th[4];
//     int num=sizeof(th)/sizeof(th[0]);

//     for(int i=0;i<num;++i)
//     {
//         //给每个线程命名
//         char *name=new char[64];
//         snprintf(name,64,"thread_%d",i+1);
//         //创建线程
//         pthread_create(th+i,nullptr,ThreadRoutine,name);
//     }

//     //线程等待
//     for(int i=0;i<num;++i)
//     {
//         pthread_join(th[i],nullptr);
//     }

//     return 0;
// }